package day11.HashSet.Map;

import org.w3c.dom.ls.LSOutput;

import java.util.ArrayList;
import java.util.Map;
import java.util.TreeMap;
import java.util.function.BiConsumer;

public class MapDemo04 {
    /*
    添加原理:
        先调对象hashcode方法得到原始哈希值，早把原始哈希值向右移动16位，进行扰动哈希，再拿着扰动后的哈希
        跟原始哈希做亦或操作，二次哈希，二次哈希后再去%数组的长度，不过源码中是数组长度-1再%上哈希值拿到索引值
     再看该索引是否有人没人存有人调用eauals方法比较一样不存，jak8之前头插之后尾插，
     如果某个索引位置挂在的链表节点数超过8 并且数组长度>=64，自动转成红黑树，如果数组长度<=64就扩容数组
     */

    public static void main(String[] args) {
        String info = "ababc";

        //准备map集合，用于统计字符的次数
        TreeMap<Character,Integer> treeMap = new TreeMap<>();
        //2 拆分字符
        char[] chars = info.toCharArray();

        //3 遍历字符数组，获取每一个字符
        for (char c : chars) {
            //判断当前字符在集合中是否存在
            if (!treeMap.containsKey(c)){
                //不存在，说明第一次出现
                treeMap.put(c,1);
            }else {
                // 存在，说明不是第一次出现，获取旧值+1存回去
                treeMap.put(c,treeMap.get(c)+1);
            }
        }
        System.out.println(treeMap);
        //5 准备StringBuilder
        StringBuilder sb = new StringBuilder();
        treeMap.forEach((character, integer) -> sb.append(character).append("(").append(integer).append(")"));
        System.out.println(sb);
    }


}
